//路由器文件
//1.安装VueRouter
//2.引入
import Vue from 'vue'
import VueRouter from "vue-router";
import routes from "@/router/routes";
import store from '@/store'


Vue.use(VueRouter)//3.使用并调用VueRouter中的方法 添加到vue身上
//为了解决路由3.1.0以后用了promise方法 跳转路由报错的问题,需要重写路由跳转的push和replace方法
const originPush=VueRouter.prototype.push
VueRouter.prototype.push=function (loction,resoleved,rejected){
   if (resoleved===undefined&&rejected===undefined){
       return originPush.call(this,loction).catch(()=>{})
   }else {
       return originPush.call(this,loction,resoleved,rejected)
   }
}
const originReplace=VueRouter.prototype.replace
VueRouter.prototype.replace=function (loacation,resolved,rejected){
    if (resolved===undefined&&rejected===undefined){
        return originReplace.call(this,location).catch(()=>{})
    }else {
        return originReplace.call(this,location,resolved,rejected)
    }
}
//4.对外暴露一个new VueRouter
const router=new VueRouter({
    routes,
    scrollBehavior(){
        return {x:0,y:0}
    }
})
//token校验 在校验的过程当中 需要获取到用户的信息
// token怎么使用 需要添加到请求头中
router.beforeEach(async(to,from,next)=>{
    // to 目的地路由对象
    // from 发起的路由对象
    //next  回调函数
    //不带参数 表示放行 任何路由都可以通过
    //带false 原地待着 啥也不干
    //带参数 路径或者是空对象 路径表示强制跳转到哪里next('/home')
    let  token=store.state.user.token
    let userInfo=store.state.user.userInfo
    //判断token在
    if (token){
        //证明用户登录过 不知道有没有用户名
        if(to.path==='/login'){
            //登录过 又去登录 强制跳转到首页
            next('/')
        }else {
            //登录过 没有用户信息 需要获取用户信息 发请求拿数据
            if (userInfo.name){
                next()
            }else {
             try {
                 //获取用户信息
                 await store.dispatch('getUserInfo')
                 next()
             }catch (e){
                 //获取用户信息失败 一般是token过期 需要清空token 重新登录
                 store.dispatch('resetToken')
                 next('/login')
             }
            }
        }
    }else {
        //token不存在 表示用户 没登录过直接去登录
       // next('/login')
        //在这里先放行
        //next()
        let targetPath=to.path
        if (targetPath.indexOf('/trade')===0||targetPath.startsWith('/center')||targetPath.startsWith('/pay')){
            next('/login?redirect='+targetPath)
        }else {
            next()
        }
    }
})

export default router
//5.在main.js中中引入 在vue的配置对象中注册路由器对象
